import { getToken, setToken, removeToken } from '@/utils/auth'
import { loginAPI, getUserProfileAPI, getUserPhotoAPI } from '@/api'
import messageTip from '@/utils/message.js'
const getDefaultState = () => {
  return {
    token: getToken() || '', // getToken() 是防止用户刷新后数据丢失
    userInfo: {},
  }
}

const state = getDefaultState()

const mutations = {
  // 重置 state 内所有的数据
  RESET_STATE: (state) => {
    removeToken() // 清除token
    Object.assign(state, getDefaultState())
  },
  SET_TOKEN(state,value){
    setToken(value) // 存一份到本地
    state.token = getToken() // 只会执行一次,后续用户刷新页面就调用上面的 getToken() || ''
  },
  SET_USERINFO(state,value){
    state.userInfo = value // 存储用户信息
  }
}

const actions = {
  // 登录接口
  async loginActions({commit},params){
    try{
      const res = await loginAPI(params)
      // 存储到本地
      commit('SET_TOKEN',res.data)
      return res
    }catch(e){
      return Promise.reject(e)
    }
  },
  // 获取用户信息(合并2个请求的信息)
  async getUserInfoActions({commit},value){
    try{
      const { data: userInfo } = await getUserProfileAPI() // 用户最基本的信息
      const { data: completeUserInfo} = await getUserPhotoAPI(userInfo.userId) // 用户比较完整的个人信息
      let userinfo = Object.assign(userInfo,completeUserInfo) // 合并2次获取的信息(也可以用扩展运算符)
      commit('SET_USERINFO',userinfo) // 存储最终合并的结果
      // commit('SET_USERINFO',{...userInfo,...completeUserInfo}) // 另一种合并的方法
      return userinfo.roles.menus
    }catch(e){
      if(e.response.data.message === 'token超时'){
        messageTip('登录超时','error')
      }
    }
  },
  // token过期
  logoutActions({commit}){
    // 清除本地存储的token + 重置 state 内的数据字段
      commit('RESET_STATE')
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}
